Skip to content

A roll can be a name, and a modifier can be longer than the join reached - #34

Merged
JIRPOS merged 1 commit into
masterfrom
fix/named-option-modifiers
Aug 10, 2026
Merged

A roll can be a name, and a modifier can be longer than the join reached#34
JIRPOS merged 1 commit into
masterfrom
fix/named-option-modifiers

Conversation

@JIRPOS

@JIRPOS JIRPOS commented Aug 10, 2026

Copy link
Copy Markdown
Owner

Release notes

CHANGED: A unique whose modifier rolls one of a list — the minion type The Dark Monarch doubles, the skill gem Replica Dragonfang's Flight raises — is recognised and searched on the one it actually rolled, instead of being reported as an unrecognised modifier.

CHANGED: A modifier that spells out its alternatives, like Bound Fate's "Every 5 seconds, gain one of the following", is read as the single modifier it is rather than as seven unrecognised lines.

CHANGED: A modifier that rolls one of a list is now ticked as one of a pool, so the search asks for the copy that rolled it, and no longer says the unique's modifier data has never heard of it.

Review notes

CHANGED: An Advanced Mod Descriptions range whose roll is a name is dropped before the wording is looked up, so Maximum number of Sentinels of Purity (Animated Weapons-Holy Armaments) is Doubled resolves to the stat trade indexes instead of matching nothing.

  • The roll is the name in the wording and the parenthesis is the first and last of the list, exactly as (50-100) is the first and last of an interval — rows 0 and 286 of a 287-row client table, against a mod whose range is 1..287. There is no numeric token in front of it for scan_numbers to hang the bounds on, which is why nothing consumed it, and why both lines of a two-line modifier missed and took the join down with them.
  • Stripping only ever adds candidates, and adds them after the printed form, so Unique Monsters (Blood-Filled Vessel): # — which qualifies on shape alone — still resolves as itself. Measured against the 373 shipped vectors: two changed, both that wording and its non-unique twin, both gaining trailing candidates only.
  • NORMALIZATION.md gains this as step 4 and the data repo's normalize.py mirrors it byte for byte; normalize_test replays 375 vectors.

CHANGED: kMaxModLines is 8 rather than 4, so a modifier that enumerates its alternatives is the one filter it is rather than seven unrecognised ones.

  • Eight is the longest wording in the data — 14,445 matchers are one line, 618 are two, and exactly one each is seven and eight. Reaching further is safe because a shorter join always wins: the loop returns at the first join that resolves, so the cap only bounds a failed match.

CHANGED: The fixture bundle is sliced from data-20260810.41, which carries the other half of this fix (Data#2): +1,960 trade ids, none lost, and a modifier that rolls a name now arrives as the pool it is.

  • Three fixture keys moved with it. A stat description now joins to its trade record where it never had, so those records take their ref from the game's own wording — and where the game hardcodes a number trade placeholds, the ref carries it (Rewards Baran drops by 20% of its value). That is already how every single-line stat behaves, and the normalizer's literal candidate is what matches it.

ADDED: Captures for The Dark Monarch, Replica Dragonfang's Flight and Bound Fate, one per shape — a named range with a space in front of it, one without and carrying a number of its own, and a seven-line modifier.

CHANGED: UNIQUE-MODS.md states that a pool of one modifier is not a mistake, and its limitation counts are re-measured against that release; docs/data-layer.md covers both rules.


Verified against the published release rather than a local build: all three wordings are claimed by exactly one record in the full 12,293-record bundle, so the 79-stat fixture is not hiding an ambiguity. 21/21 suites pass.

CHANGED: An Advanced Mod Descriptions range whose roll is a name is dropped
before the wording is looked up, so "Maximum number of Sentinels of Purity
(Animated Weapons-Holy Armaments) is Doubled" resolves to the stat trade
indexes instead of matching nothing.

- The roll is the name in the wording and the parenthesis is the first and
  last of the list, exactly as "(50-100)" is the first and last of an
  interval. There is no numeric token in front of it for `scan_numbers` to
  hang the bounds on, which is why nothing consumed it.
- Stripping only ever *adds* candidates, and adds them after the printed
  form, so "Unique Monsters (Blood-Filled Vessel): #" — which qualifies on
  shape alone — still resolves as itself. Measured against the 373 shipped
  vectors: two changed, both that wording and its twin, both gaining
  trailing candidates only.

CHANGED: One modifier may span eight clipboard lines instead of four, so a
modifier that enumerates its alternatives is the one filter it is rather
than seven unrecognised ones.

- Eight is the longest wording in the data. Reaching further is safe
  because a shorter join always wins: the loop returns at the first join
  that resolves, so the cap only bounds a failed match.

CHANGED: The fixture bundle is sliced from data-20260810.41, which gives a
modifier that rolls a name the trade id and the pool it was missing — so
the row is ticked as pooled rather than carrying "not in the modifier data
for this unique".

ADDED: Captures for The Dark Monarch, Replica Dragonfang's Flight and Bound
Fate, one per shape: a named range with a space before it, one without and
carrying a number of its own, and a seven-line modifier.

CHANGED: UNIQUE-MODS.md states that a pool of one modifier is not a
mistake, and its limitation counts are re-measured against that release.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@JIRPOS
JIRPOS merged commit 7272891 into master Aug 10, 2026
9 checks passed
@JIRPOS
JIRPOS deleted the fix/named-option-modifiers branch August 10, 2026 22:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant